#include <iostream>
#include <mutex>

using namespace std;

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // C++11保证线程安全的局部静态变量初始化
        return instance;
    }

    // 禁止拷贝构造和赋值
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

private:
    Singleton() {
        std::cout << "Singleton created" << std::endl;
    }
    ~Singleton() {
        std::cout << "Singleton destroyed" << std::endl;
    }
};

class CSingleton
{
public:
    static CSingleton* getInstance()
    {
        return &single;
    }
private:
    static CSingleton single;
    CSingleton() { cout << "CSingleton()" << endl; }
    ~CSingleton() { cout << "~CSingleton()" << endl; }
    CSingleton(const CSingleton&); // 防止外部使用拷贝构造产生新的对象，如下面CSingleton s = *p1;
};
CSingleton CSingleton::single;


// 饿汉式单例模式，顾名思义，就是程序启动时就实例化了该对象，
// 并没有推迟到第一次使用该对象时再进行实例化；如果运行过程中没有使用到，该实例对象就被浪费掉了。

int main() {
    Singleton& s1 = Singleton::getInstance();
    Singleton& s2 = Singleton::getInstance();

    CSingleton *p1 = CSingleton::getInstance();
    CSingleton *p2 = CSingleton::getInstance();
    CSingleton *p3 = CSingleton::getInstance();
    cout<<p1<<" "<<p2<<" "<<p3<<endl;
    return 0;
}
